home *** CD-ROM | disk | FTP | other *** search
/ Internet Info 1994 March / Internet Info CD-ROM (Walnut Creek) (March 1994).iso / networking / ip / ka9q / src890906.arc / CONFIG.C < prev    next >
C/C++ Source or Header  |  1989-09-07  |  11KB  |  492 lines

  1. /* Stuff heavily dependent on the configuration info in config.h */
  2.  
  3. #include <stdio.h>
  4. #include "global.h"
  5. #include "mbuf.h"
  6. #include "proc.h"
  7. #include "cmdparse.h"
  8. #include "config.h"
  9. #include "daemon.h"
  10. #include "timer.h"
  11. #include "iface.h"
  12. #include "usock.h"
  13. #include "kiss.h"
  14. #include "enet.h"
  15. #include "ax25.h"
  16. #include "netrom.h"
  17. #include "ip.h"
  18. #include "tcp.h"
  19. #include "udp.h"
  20. #include "commands.h"
  21.  
  22. static void showtrace __ARGS((struct iface *ifp));
  23. static int dosock __ARGS((int argc,char *argv[],void *p));
  24. static int dostart __ARGS((int argc,char *argv[],void *p));
  25. static int dostop __ARGS((int argc,char *argv[],void *p));
  26. static int dotrace __ARGS((int argc,char *argv[],void *p));
  27.  
  28. unsigned Nsessions = NSESSIONS;
  29. int32 Heapsize = HEAPSIZE * (long)1024;
  30.  
  31. /* daemons to be run at startup time */
  32. struct daemon Daemons[] = {
  33.     "killer",    200,    killer,
  34.     "timer",    512,    timerproc,
  35.     "network",    1024,    network,
  36.     "keyboard",    250,    keyboard,
  37.     NULLCHAR,    0,    NULLVFP
  38. };
  39.  
  40. /* Command lookup and branch tables */
  41.  
  42. struct cmds Cmds[] = {
  43.     /* The "go" command must be first */
  44.     "",        go,        0, 0, NULLCHAR,
  45. #ifndef    AMIGA
  46.     "!",        doshell,    0, 0, NULLCHAR,
  47. #endif
  48.     "abort",    doabort,    0, 0, NULLCHAR,
  49. #if    (defined(MAC) && defined(APPLETALK))
  50.     "applestat",    doatstat,    0,    0, NULLCHAR,
  51. #endif
  52. #if    (defined(AX25) || defined(ETHER) || defined(APPLETALK))
  53.     "arp",        doarp,        0, 0, NULLCHAR,
  54. #endif
  55. #ifdef    ASY
  56.     "asystat",    doasystat,    0, 0, NULLCHAR,
  57. #endif
  58. #ifdef    AX25
  59.     "ax25",        doax25,        0, 0, NULLCHAR,
  60. #endif    
  61.     "attach",    doattach,    0, 2,
  62.         "attach <hardware> <hw specific options>",
  63. /* This one is out of alpabetical order to allow abbreviation to "c" */
  64. #ifdef    AX25
  65.     "connect",    doconnect,    1024, 3,"connect <interface> <callsign>",
  66. #endif
  67. #if    !defined(UNIX) && !defined(AMIGA)
  68.     "cd",        docd,        0, 0, NULLCHAR,
  69. #endif
  70.     "close",    doclose,    0, 0, NULLCHAR,
  71.     "disconnect",    doclose,    0, 0, NULLCHAR,
  72. #ifndef    AMIGA
  73.     "dir",        dodir,        0, 0, NULLCHAR, /* note sequence */
  74. #endif
  75.     "delete",    dodelete,    0, 2, "delete <file>",
  76.     "domain",    dodomain,    0, 0, NULLCHAR,
  77. #ifdef    HS
  78.     "hs",        dohs,        0, 0, NULLCHAR,
  79. #endif
  80. #ifdef    EAGLE
  81.     "eaglestat",    doegstat,    0, 0, NULLCHAR,
  82. #endif
  83.     "echo",        doecho,        0, 0, NULLCHAR,
  84.     "eol",        doeol,        0, 0, NULLCHAR,
  85. #if    !defined(MSDOS) && !defined(AMIGA)
  86.     "escape",    doescape,    0, 0, NULLCHAR,
  87. #endif
  88. #ifdef    PC_EC
  89.     "etherstat",    doetherstat,    0, 0, NULLCHAR,
  90. #endif
  91.     "exit",        doexit,        0, 0, NULLCHAR,
  92.     "finger",    dofinger,    1024, 0, NULLCHAR,
  93.     "forward",    doforward,    0, 0, NULLCHAR,
  94.     "ftp",        doftp,        2048, 2, "ftp <address>",
  95. #ifdef HAPN
  96.     "hapnstat",    dohapnstat,    0, 0, NULLCHAR,
  97. #endif
  98.     "help",        dohelp,        0, 0, NULLCHAR,
  99.     "hostname",    dohostname,    0, 0, NULLCHAR,
  100.     "icmp",        doicmp,        0, 0, NULLCHAR,
  101.     "ip",        doip,        0, 0, NULLCHAR,
  102.     "kick",        dokick,        0, 0, NULLCHAR,
  103.     "log",        dolog,        0, 0, NULLCHAR,
  104. #ifdef    AX25
  105.     "mbox",        dombox,        0, 0, NULLCHAR,
  106. #endif
  107. #ifndef    AMIGA
  108.     "memstat",    memstat,    0, 0, NULLCHAR,
  109. #endif
  110. #ifdef    AX25
  111.     "mode",        domode,        0, 2, "mode <interface>",
  112. #endif
  113. #ifdef    NETROM
  114.     "netrom",    donetrom,    0, 0, NULLCHAR,
  115. #ifdef    NRS
  116.     "nrstat",    donrstat,    0, 0, NULLCHAR,
  117. #endif    /* NRS */
  118. #endif    /* NETROM */
  119.     "param",    doparam,    0, 2, "param <interface>",
  120.     "ping",        doping,        512, 2, "ping <host> [<length> <interval>]",
  121.     "ps",        ps,        0, 0, NULLCHAR,
  122. #if    !defined(UNIX) && !defined(AMIGA)
  123.     "pwd",        docd,        0, 0, NULLCHAR,
  124. #endif
  125.     "record",    dorecord,    0, 0, NULLCHAR,
  126.     "remote",    doremote,    0, 3, "remote [-p port] [-k key] [-a kickaddr] <address> exit|reset|kick",
  127.     "rename",    dorename,    0, 3, "rename <oldfile> <newfile>",
  128.     "reset",    doreset,    0, 0, NULLCHAR,
  129.     "route",    doroute,    0, 0, NULLCHAR,
  130.     "session",    dosession,    0, 0, NULLCHAR,
  131. #if    !defined(AMIGA)
  132.     "shell",    doshell,    0, 0, NULLCHAR,
  133. #endif
  134.     "smtp",        dosmtp,        0, 0, NULLCHAR,
  135.     "socket",    dosock,        0, 0, NULLCHAR,
  136. #ifdef    SERVERS
  137.     "start",    dostart,    0, 2, "start <servername>",    /**/
  138.     "stop",        dostop,        0, 2, "stop <servername>",
  139. #endif
  140.     "tcp",        dotcp,        0, 0, NULLCHAR,
  141.     "telnet",    dotelnet,    1024, 2, "telnet <address>",
  142. #ifdef    TRACE
  143.     "trace",    dotrace,    0, 0, NULLCHAR,
  144. #endif
  145.     "udp",        doudp,        0, 0, NULLCHAR,
  146.     "upload",    doupload,    0, 0, NULLCHAR,
  147.     "?",        dohelp,        0, 0, NULLCHAR,
  148.     NULLCHAR,    NULLFP,        0, 0,
  149.         "Unknown command; type \"?\" for list",
  150. };
  151.  
  152. /* List of supported hardware devices */
  153. struct cmds Attab[] = {
  154. #ifdef    PC_EC
  155.     /* 3-Com Ethernet interface */
  156.     "3c500", ec_attach, 0, 7, 
  157.     "attach 3c500 <address> <vector> arpa <label> <buffers> <mtu>",
  158. #endif
  159. #ifdef    ASY
  160.     /* Ordinary PC asynchronous adaptor */
  161.     "asy", asy_attach, 0, 8, 
  162. #ifndef    AMIGA
  163.     "attach asy <address> <vector> slip|ax25|nrs <label> <buffers> <mtu> <speed>",
  164. #else
  165.      "attach asy <driver> <unit> slip|ax25|nrs <label> <buffers> <mtu> <speed>",
  166. #endif    /* AMIGA */
  167. #endif    /* ASY */
  168. #ifdef    PC100
  169.     /* PACCOMM PC-100 8530 HDLC adaptor */
  170.     "pc100", pc_attach, 0, 8, 
  171.     "attach pc100 <address> <vector> ax25 <label> <buffers> <mtu> <speed>",
  172. #endif
  173. #ifdef    EAGLE
  174.     /* EAGLE RS-232C 8530 HDLC adaptor */
  175.     "eagle", eg_attach, 0, 8,
  176.     "attach eagle <address> <vector> ax25 <label> <buffers> <mtu> <speed>",
  177. #endif
  178. #ifdef    HAPN
  179.     /* Hamilton Area Packet Radio (HAPN) 8273 HDLC adaptor */
  180.     "hapn", hapn_attach, 0, 8,
  181.     "attach hapn <address> <vector> ax25 <label> <rx bufsize> <mtu> csma|full",
  182. #endif
  183. #ifdef    APPLETALK
  184.     /* Macintosh AppleTalk */
  185.     "0", at_attach, 0, 7,
  186.     "attach 0 <protocol type> <device> arpa <label> <rx bufsize> <mtu>",
  187. #endif
  188. #ifdef NETROM
  189.     /* fake netrom interface */
  190.     "netrom", nr_attach, 0, 1,
  191.     "attach netrom",
  192. #endif
  193. #ifdef    PACKET
  194.     /* FTP Software's packet driver spec */
  195.     "packet", pk_attach, 0, 4,
  196.     "attach packet <int#> <label> <buffers> <mtu>",
  197. #endif
  198. #ifdef    HS
  199.     /* Special high speed driver for DRSI PCPA or Eagle cards */
  200.     "hs", hs_attach, 0, 7,
  201.     "attach hs <address> <vector> ax25 <label> <buffers> <mtu> <txdelay> <persistence>",
  202. #endif
  203.     NULLCHAR,
  204. };
  205.  
  206. /* Packet tracing stuff */
  207. #ifdef    TRACE
  208. #include "trace.h"
  209. /* Dummy structure for loopback tracing */
  210. struct iface Loopback = { NULLIF, "loopback" };
  211.  
  212. /* Protocol tracing function pointers */
  213. struct trace Tracef[] = {
  214. #ifdef    AX25
  215.     ax_forus,    ax25_dump,
  216. #else
  217.     NULLFP,        NULLVFP,
  218. #endif    /* AX25 */
  219.  
  220. #ifdef    ETHER
  221.     ether_forus,    ether_dump,
  222. #else
  223.     NULLFP,        NULLVFP,
  224. #endif    /* ETHER */
  225.  
  226.     NULLFP,        ip_dump,
  227.  
  228. #ifdef    APPLETALK
  229.     at_forus,    at_dump,
  230. #else
  231.     NULLFP,        NULLVFP,
  232. #endif    /* APPLETALK */
  233.  
  234. #ifdef    KISS
  235.     ki_forus,    ki_dump,
  236. #else
  237.     NULLFP,        NULLVFP,
  238. #endif    /* KISS */
  239.  
  240. };
  241.  
  242. static int
  243. dotrace(argc,argv,p)
  244. int argc;
  245. char *argv[];
  246. void *p;
  247. {
  248.     struct iface *ifp;
  249.  
  250.     if(argc < 2){
  251.         showtrace(&Loopback);
  252.         for(ifp = Ifaces; ifp != NULLIF; ifp = ifp->next)
  253.             showtrace(ifp);
  254.         return 0;
  255.     }
  256.     if(strcmp("loopback",argv[1]) == 0)
  257.         ifp = &Loopback;
  258.     else 
  259.         for(ifp = Ifaces; ifp != NULLIF; ifp = ifp->next)
  260.             if(strcmp(ifp->name,argv[1]) == 0)
  261.                 break;
  262.  
  263.     if(ifp == NULLIF){
  264.         printf("Interface %s unknown\n",argv[1]);
  265.         return 1;
  266.     }
  267.     if(argc >= 3)
  268.         ifp->trace = htoi(argv[2]);
  269.  
  270.     showtrace(ifp);
  271.     return 0;
  272. }
  273. /* Display the trace flags for a particular interface */
  274. static void
  275. showtrace(ifp)
  276. register struct iface *ifp;
  277. {
  278.     if(ifp == NULLIF)
  279.         return;
  280.     printf("%s:",ifp->name);
  281.     if(ifp->trace & (IF_TRACE_IN | IF_TRACE_OUT)){
  282.         if(ifp->trace & IF_TRACE_IN)
  283.             printf(" input");
  284.         if(ifp->trace & IF_TRACE_OUT)
  285.             printf(" output");
  286.  
  287.         if(ifp->trace & IF_TRACE_NOBC)
  288.             printf(" - no broadcasts");
  289.  
  290.         if(ifp->trace & IF_TRACE_HEX)
  291.             printf(" (Hex/ASCII dump)");
  292.         else if(ifp->trace & IF_TRACE_ASCII)
  293.             printf(" (ASCII dump)");
  294.         else
  295.             printf(" (headers only)");
  296.         printf("\n");
  297.     } else
  298.         printf(" tracing off\n");
  299. }
  300.  
  301. #else    /* TRACE */
  302.  
  303. /* Stubs for tracing disabled */
  304. struct trace Tracef[] = {
  305.     NULLFP        /* No tracing at all */
  306. };
  307.  
  308. dump(iface,direction,type,bp)
  309. struct iface *iface;
  310. int direction;
  311. unsigned type;
  312. struct mbuf *bp;
  313. {
  314. }
  315.  
  316. #endif    /* TRACE */
  317.  
  318.  
  319. #if    defined(AX25) && !defined(NETROM)
  320.  
  321. /* Stubs for when ax25 is configured wihtout net/rom */
  322. void
  323. nr_route(bp,iaxp)
  324. struct mbuf *bp;
  325. struct ax25_cb *iaxp;
  326. {
  327.     free_p(bp);
  328. }
  329. void
  330. nr_nodercv(iface,source,bp)
  331. struct iface *iface;
  332. struct ax25_addr *source;
  333. struct mbuf *bp;
  334. {
  335.     free_p(bp);
  336. }
  337. #endif    /* defined(AX25) && !defined(NETROM) */
  338.  
  339.  
  340. #ifdef    SERVERS
  341. /* "start" and "stop" subcommands */
  342. static struct cmds Startcmds[] = {
  343. #ifdef    AX25
  344.     "ax25",        ax25start,    256, 0, NULLCHAR,
  345. #endif
  346.     "discard",    dis1,        256, 0, NULLCHAR,
  347.     "echo",        echo1,        256, 0, NULLCHAR,
  348.     "finger",    finstart,    256, 0, NULLCHAR,
  349.     "ftp",        ftpstart,    256, 0, NULLCHAR,
  350. #ifdef    NETROM
  351.     "netrom",    nr4start,    256, 0, NULLCHAR,
  352. #endif
  353.     "smtp",        smtp1,        256, 0, NULLCHAR,
  354.     "telnet",    tnstart,    256, 0, NULLCHAR,
  355.     "remote",    rem1,        256, 0, NULLCHAR,
  356.     NULLCHAR,
  357. };
  358. static struct cmds Stopcmds[] = {
  359. #ifdef    AX25
  360.     "ax25",        ax250,        0, 0, NULLCHAR,
  361. #endif
  362.     "discard",    dis0,        0, 0, NULLCHAR,
  363.     "echo",        echo0,        0, 0, NULLCHAR,
  364.     "finger",    fin0,        0, 0, NULLCHAR,
  365.     "ftp",        ftp0,        0, 0, NULLCHAR,
  366. #ifdef    NETROM
  367.     "netrom",    nr40,        0, 0, NULLCHAR,
  368. #endif
  369.     "smtp",        smtp0,        0, 0, NULLCHAR,
  370.     "telnet",    tn0,        0, 0, NULLCHAR,
  371.     "remote",    rem0,        0, 0, NULLCHAR,
  372.     NULLCHAR,
  373.  
  374. };
  375. static int
  376. dostart(argc,argv,p)
  377. int argc;
  378. char *argv[];
  379. void *p;
  380. {
  381.     return subcmd(Startcmds,argc,argv,p);
  382. }
  383. static int
  384. dostop(argc,argv,p)
  385. int argc;
  386. char *argv[];
  387. void *p;
  388. {
  389.     return subcmd(Stopcmds,argc,argv,p);
  390. }
  391. #endif    /* SERVERS */
  392.  
  393. /* Various configuration-dependent functions */
  394.  
  395. /* Process packets in the Hopper */
  396. static void
  397. network(i,v1,v2)
  398. int i;
  399. void *v1;
  400. void *v2;
  401. {
  402.     struct mbuf *bp;
  403.     struct phdr phdr;
  404.     char i_state;
  405.  
  406. loop:    i_state = dirps();
  407.     while(Hopper == NULLBUF)
  408.         pwait(&Hopper);
  409.     restore(i_state);
  410.  
  411.     /* Process the input packet */
  412.     bp = dequeue(&Hopper);
  413.     pullup(&bp,(char *)&phdr,sizeof(phdr));
  414.     dump(phdr.iface,IF_TRACE_IN,phdr.type,bp);
  415.     switch(phdr.type){
  416. #ifdef    KISS
  417.     case TYPE_KISS:
  418.         kiss_recv(phdr.iface,bp);
  419.         break;
  420. #endif
  421. #ifdef    AX25
  422.     case TYPE_AX25:
  423.         ax_recv(phdr.iface,bp);
  424.         break;
  425. #endif
  426.     case TYPE_ETHER:
  427.         eproc(phdr.iface,bp);
  428.         break;
  429.     case TYPE_IP:
  430.         ip_route(phdr.iface,bp,0);
  431.         break;
  432.     case TYPE_APPLETALK:
  433.     default:
  434.         free_p(bp);
  435.         break;
  436.     }
  437.     goto loop;
  438. }
  439.  
  440.  
  441. /* Socket status display command */
  442. static int
  443. dosock(argc,argv,p)
  444. int argc;
  445. char *argv[];
  446. void *p;
  447. {
  448.     register struct usock *up;
  449.     int s;
  450.  
  451.     if(argc < 2){
  452.         printf("S# Type    PCB      Owner\n");
  453.         for(s=0;s<Nusock;s++){
  454.             up = &Usock[s];
  455.             if(up->type == NOTUSED)
  456.                 continue;
  457.             printf("%2d %-8s%-8lx %lx (%s)\n",
  458.              s,Socktypes[up->type],ptol(up->cb.p),
  459.              ptol(up->owner),up->owner->name);
  460.         }
  461.         return 0;
  462.     }
  463.     s = atoi(argv[1]);
  464.     if(s < 0 || s >= Nusock){
  465.         printf("Number out of range\n");
  466.         return 1;
  467.     }
  468.     up = &Usock[s];
  469.     printf("%s %lx\n",Socktypes[up->type],ptol(up->cb.p));
  470.     if(up->cb.p == NULL)
  471.         return 0;
  472.     switch(up->type){
  473.     case TYPE_TCP:
  474.         st_tcp(up->cb.tcb);
  475.         break;
  476.     case TYPE_UDP:
  477.         st_udp(up->cb.udp,0);
  478.         break;
  479. #ifdef    AX25
  480.     case TYPE_AX25I:
  481.         st_ax25(up->cb.ax25);
  482.         break;
  483. #endif
  484. #ifdef    NETROM
  485.     case TYPE_NETROML4:
  486.         donrdump(up->cb.nr4);
  487.         break;
  488. #endif
  489.     }
  490.     return 0;    
  491. }
  492.